package com.engr.util;

import org.springframework.util.StringUtils;
import org.springframework.web.bind.ServletRequestUtils;

import javax.servlet.http.HttpServletRequest;
import java.lang.reflect.Array;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

/**
 * 对 spring ServletRequestUtils 的一个简单继承，使用该类可以方便的获取参数。<br />
 * 灵活使用和扩展。
 * @author :kezhan
 * @since : 2018年6月20日
 * @version : v0.0.1
 */
public class ServletUtil extends ServletRequestUtils {
	
	/**
	 * 取request中参数集合，如果有多个值的，获取的是数组
	 * @param request
	 * @param isParams
	 * @return
	 * @author :kezhan	
	 * @since : 2018年6月20日
	 */
	public static Map<String, Object> getParameterMap(HttpServletRequest request, boolean isParams) {
		Map<String, Object> parameterMap = new HashMap<String, Object>();
		Map<String, String[]> paramMap = request.getParameterMap();
		for (Iterator<String> iter = paramMap.keySet().iterator(); iter.hasNext();) {
			String key = iter.next();
			Object value = null;
			Object obj = paramMap.get(key);
			if (isParams) {
				value = obj;
			} else {
				if ((obj.getClass().isArray()) && Array.getLength(obj) >= 1) {
					value = Array.get(obj, 0);
				}
			}
			if (value != null) {
				if (value.getClass().isArray()) {
					int len = Array.getLength(value);
					for (int i = 0; i < len; i++) {
						Object temp = Array.get(value, i);
						Array.set(value, i,	temp != null ? temp.toString().trim() : null);
					}
				} else {
					value = value != null ? value.toString().trim() : null;
				}
			}
			parameterMap.put(key, value);
		}
		return parameterMap;
	}

	
	/**
	 *  页面以“,”拼写的字符串，传递到后台以后分割为数字数组形式
	 * @param request
	 * @param name
	 * @return
	 * @author :kezhan	
	 * @since : 2018年6月20日
	 */
	public static int[] getIntParameters(HttpServletRequest request, String name) {
		String agrs = request.getParameter(name);
		if (StringUtils.hasText(agrs)) {
			String[] as = agrs.split(",");
			int[] rs = new int[as.length];
			for (int i = 0; i < as.length; i++) {
				int z = 0;
				try {
					z = Integer.valueOf(as[i]);
				} catch (NumberFormatException e) {
					continue;
				}
				rs[i] = z;
			}
			return rs;
		} else {
			return new int[] {};
		}
	}

	
	/**
	 * 使用 Long 默认值的获取参数
	 * @param request
	 * @param name
	 * @param defaultValue
	 * @return
	 * @author :kezhan	
	 * @since : 2018年6月20日
	 */
	public static Long getLongParameter(HttpServletRequest request,
                                        String name, Long defaultValue) {
		String agrs = request.getParameter(name);
		try {
			defaultValue = Long.parseLong(agrs);
		} catch (NumberFormatException e) {
		}
		return defaultValue;
	}
	
	
	public static Integer getIntParameter(HttpServletRequest request,
                                          String name, Integer defaultValue) {
		String agrs = request.getParameter(name);
		try {
			defaultValue = Integer.parseInt(agrs);
		} catch (NumberFormatException e) {
		}
		return defaultValue;
	}

	
	/**
	 * 获取客户外网id
	 * @param request
	 * @return
	 */
	public static String getIpAddr(HttpServletRequest request) {
        String ip = request.getHeader("X-Real-IP");
        if (ip!=null&& !"unknown".equalsIgnoreCase(ip)) {
            return ip;
        }
        ip = request.getHeader("X-Forwarded-For");
        if (ip!=null && !"unknown".equalsIgnoreCase(ip)) {
            // 多次反向代理后会有多个IP值，第一个为真实IP。
            int index = ip.indexOf(',');
            if (index != -1) {
                return ip.substring(0, index);
            } else {
                return ip;
            }
        } else {
           return request.getRemoteAddr();
        }
    }
}
